package service

import (
	"cs-backend/db"
	"cs-backend/dto"
	"cs-backend/util"
	"fmt"
	"reflect"
)

type CommonService struct {
}

func beforeInsert(bean interface{}) {
	util.Log.Info("beforeInsert")
}

func beforeModify(entity interface{}) {
	//当前时间
	//current_date := time.Now().Format("2006-01-02 15:04:05")
	//默认更新者
	default_user := "100000"
	//对象操作
	entity_value := reflect.ValueOf(entity).Elem()

	/*//设置更新时间
	field_ModifyDate := entity_value.FieldByName("ModifyTime")
	if field_ModifyDate.String() == "" {
		field_ModifyDate.SetString(current_date)
	}*/
	//设置更新者
	field_ModifyUser := entity_value.FieldByName("ModifyUser")
	if field_ModifyUser.String() == "" {
		field_ModifyUser.SetString(default_user)
	}

}

func beforeDelete(entity interface{}) {
	//当前时间
	//current_date := time.Now().Format("2006-01-02 15:04:05")
	//默认删除者
	default_user := "100000"
	//对象操作
	entity_value := reflect.ValueOf(entity).Elem()

	/*//设置更新时间
	field_ModifyDate := entity_value.FieldByName("ModifyTime")
	if field_ModifyDate.String() == "" {
		field_ModifyDate.SetString(current_date)
	}*/
	//设置删除者
	field_DeleteUser := entity_value.FieldByName("DeleteUser")
	if field_DeleteUser.String() == "" {
		field_DeleteUser.SetString(default_user)
	}

}

func beforeSave(entity interface{}) interface{} {
	//当前时间
	//current_date := time.Now().Format("2006-01-02 15:04:05")
	//默认创建者
	default_user := "100000"
	//对象操作
	entity_value := reflect.ValueOf(entity).Elem()

	/*	//设置创建时间  通过`xorm:"created"`配置
		field_CreateDate := entity_value.FieldByName("CreateTime")
		if field_CreateDate.String() == "" {
			field_CreateDate.SetString(current_date)
		}*/
	//设置创建者
	field_CreateUser := entity_value.FieldByName("CreateUser")
	if field_CreateUser.String() == "" {
		field_CreateUser.SetString(default_user)
	}

	beforeModify(entity)

	var id interface{}
	//设置id
	//field_Id := entity_value.FieldByName("Id")
	//if field_Id.String() == "" {
	//	//使用bson.NewObject作为主键
	//	id = bson.NewObjectId().Hex()
	//	field_Id.Set(reflect.ValueOf(id))
	//}
	return id
}

//func (s *BaseService) GetById(entity interface{}) dto.ApiResponse {
//
//	err := db.GetEngine().Find(&entity)
//	if err != nil {
//		return dto.ResponseInternalServerError()
//	}
//	return dto.ResponseSuccess(entity)
//	//if has {
//	//	return dto.ResponseSuccess(user)
//	//} else {
//	//	return dto.ResponseNotFound()
//	//}
//}

/**
通用的插入操作
*/
func (s *CommonService) Insert(entity interface{}) dto.ApiResponse {
	affected, err := db.GetEngine().Insert(entity)
	if err != nil || affected <= 0 {
		return dto.ResponseInternalServerError()
	}

	return dto.ResponseSuccess(entity)
}

/**
通用的修改操作
*/
func (s *CommonService) Update(entity interface{}) dto.ApiResponse {
	entityValue := reflect.ValueOf(entity).Elem()
	//获取实体下面的Base对象属性Id
	id := entityValue.FieldByName("Id").Int()
	affected, err := db.GetEngine().ID(id).Update(entity)
	if err != nil {
		return dto.ResponseInternalServerError()

	}
	if affected <= 0 {
		return dto.ResponseNotFound()
	}
	return dto.ResponseSuccess(entity)
}

/**
通用的删除操作
*/
func (s *CommonService) Delete(entity interface{}, userid int64) dto.ApiResponse {
	entityValue := reflect.ValueOf(entity).Elem()
	//获取实体下面的Base对象属性Id
	id := entityValue.FieldByName("Id").Int()

	//err := db.GetEngine().ID(id).Find(entity)
	has, err := db.GetEngine().Get(entity)
	if err != nil {
		return dto.ResponseInternalServerError()
	}
	if !has {
		return dto.ResponseNotFound()
	}

	entityValue.FieldByName("DeletedBy").SetInt(userid)
	affected, err := db.GetEngine().ID(id).Update(entity)
	if err != nil {
		return dto.ResponseInternalServerError()

	}
	if affected <= 0 {
		return dto.ResponseNotFound()
	}

	affected, err = db.GetEngine().ID(id).Delete(entity)
	if err != nil {
		return dto.ResponseInternalServerError()
	}
	if affected <= 0 {
		return dto.ResponseNotFound()
	}

	return dto.ResponseSuccess(nil)
}

func (s *CommonService) ListAll(slice interface{}) dto.ApiResponse {
	//tt := reflect.TypeOf(entity).Elem()
	//datalist := make([]tt, 0)
	//
	//newStruc := reflect.New(tt)
	//datalist := make([]interface{},0)
	//tableName := db.GetEngine().TableName(entity)
	//resultMap := db.GetEngine().SQL("SELECT * FROM " + tableName).Query()
	//make([]tt,0)
	err := db.GetEngine().Find(&slice)
	//result, err := db.GetEngine().Table(entity).QueryInterface()
	//result, err := db.GetEngine().Table(entity).QueryInterface()
	if err != nil {
		fmt.Println(err)
		return dto.ResponseInternalServerError()
	}
	return dto.ResponseSuccess(slice)
}
